package base.regex.demo01;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.io.IOException;

/**
 * @author zjw
 * @date 2022/3/24 17:19
 * @des 正则表达式
 */
@Slf4j
public class TestDemo {

    public static void main(String[] args) {
        System.out.print("Input a char: 直接回车键试试");
        /**
         * 回车键是两个字符\r\n,其中\r表示回车(光标定位到当前行行首而不换行),\n表示换行(新行),
         * 因此一个回车键就表示新起一行,光标处于新行行首
         */

        try {
            char c = (char)System.in.read();
            System.out.println("Hello" + c + "World");
            System.out.print("New\nDay");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * \\s匹配空白字符
     * \\S匹配非空白字符
     * '\\s\\S'虽然有的书上讲匹配所有,但我认为并不能代表全部字符,比如""
     * ^匹配字符串开始位置,当该符号在方括号表达式中使用时，表示不接受该方括号表达式中的字符集合
     * .匹配除回车换行符（\r、\n）之外的任何单个字符，相等于 [^\n\r]
     */
    @Test
    public void testCase2(){
        log.info("---------------\\s匹配空白字符,回车符,换行符和制表符-----------------");
        String regex = "\\s";//注意匹配多个空格(比如制表键)得用\\s*
        System.out.println(("").matches(regex));//false
        System.out.println("  ".matches(regex));//false 这是2个空白字符,需要\\s*去匹配
        System.out.println("    ".matches(regex));//false 这是制表符输出来的空白,\\s匹配的是制表符而不是制表符留出来的空格
        System.out.println(" ".matches(regex));//true 匹配空白字符
        System.out.println("\r".matches(regex));//true 匹配回车符
        System.out.println("\n".matches(regex));//true 匹配换行符
        System.out.println("\t".matches(regex));//true 匹配制表符

        log.info("---------------\\S匹配非空白字符------------------");
        regex = "\\S";
        System.out.println("".matches(regex));//false
        System.out.println(" ".matches(regex));//false
        System.out.println("    ".matches(regex));//false
        System.out.println(" ".matches("[^\\S]"));//true
        System.out.println("a".matches("[^\\s]"));//true
        System.out.println("".matches("[\\s\\S]"));//false
        System.out.println("a".matches("[\\s\\S]"));//true

        log.info("-----------.匹配除换行回车外的任一单个字符----------------------");
        regex = ".";
        System.out.println("\n".matches(regex));//false
        System.out.println("\r".matches(regex));//false
        System.out.println("\t".matches(regex));//true
        System.out.println("".matches(regex));//false
        System.out.println("a".matches(regex));//true
    }

    /**
     * "do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do"
     */
    @Test
    public void testCase3(){
        String regex = "do(es)?";
        System.out.println("doxy".matches(regex));//false
        System.out.println("doxy".contains(regex));//false
        String[] ss = "doxy".split(regex);
        System.out.println(ss.length);
        for (String s : ss) {
            System.out.println(s);// '' xy
        }
    }

    /**
     *  * 和 + 限定符都是贪婪的，因为它们会尽可能多的匹配文字，只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配
     */
    @Test
    public void testCase4(){
        String s = "<h1>RUNOOB-菜鸟教程</h1>";
        String regex = "<.*>";//匹配<h1>...</h1>
        System.out.println(s.matches(regex));//true

        regex = "<.*?>";//只匹配 <h1>
        System.out.println(s.matches(regex));
        String[] sss = s.split(regex);
        System.out.println(sss.length);
        for (String ss : sss) {
            System.out.println(ss);
        }
    }
}
